package com.xxxtea.sdk.sms;

import com.dtflys.forest.annotation.BaseRequest;
import com.dtflys.forest.annotation.JSONBody;
import com.dtflys.forest.annotation.LogEnabled;
import com.dtflys.forest.annotation.Post;
import com.dtflys.forest.exceptions.ForestRuntimeException;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.http.ForestResponse;
import com.dtflys.forest.interceptor.Interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 阿里云短信SDK客户端
 * 
 * 封装阿里云短信服务的API调用，包括：
 * - 发送短信验证码
 * - 阿里云API签名处理
 * - 异常处理和日志记录
 * 
 * 使用Forest HTTP客户端进行API调用
 * 
 * @author badman
 * @since 1.0.0
 */
@LogEnabled(logResponseContent = true)
@BaseRequest(
		baseURL = "https://dysmsapi.aliyuncs.com",
		interceptor = AliyunSmsClient.AliyunSmsInterceptor.class
)
public interface AliyunSmsClient {

	/**
	 * 发送短信
	 * 
	 * 调用阿里云短信API发送短信
	 * 
	 * @param request 短信请求参数
	 * @return 短信发送响应结果
	 */
	@Post(url = "/", contentType = "application/json")
	SendSmsResponse sendSms(@JSONBody SendSmsRequest request);

	/**
	 * 发送验证码短信（便捷方法）
	 * 
	 * 简化发送验证码的调用方式
	 * 
	 * @param phone 手机号码
	 * @param code 验证码
	 */
	default void sendSms(String phone, String code) {
		// TODO: 实现便捷的验证码发送逻辑
	}

	/**
	 * 阿里云短信拦截器
	 * 
	 * 负责处理阿里云API的签名认证和异常处理
	 * 
	 * @author badman
	 * @since 1.0.0
	 */
	@Component
	class AliyunSmsInterceptor implements Interceptor<SendSmsResponse> {
		//        @Value("${aliyun.sms.accessKeyId}")
		/**
		 * 阿里云访问密钥ID
		 */
		private String accessKeyId;

		//        @Value("${aliyun.sms.accessKeySecret}")
		/**
		 * 阿里云访问密钥Secret
		 */
		private String accessKeySecret;

		/**
		 * 请求执行前的拦截处理
		 * 
		 * 添加阿里云API所需的认证参数
		 * 
		 * @param request Forest请求对象
		 * @return 是否继续执行请求
		 */
		@Override
		public boolean beforeExecute(ForestRequest request) {
			// 这里需要添加阿里云API的签名逻辑
			request.addQuery("AccessKeyId", accessKeyId);
			return true;
		}

		/**
		 * 请求异常处理
		 * 
		 * 记录阿里云短信API调用异常日志
		 * 
		 * @param ex 异常对象
		 * @param request 请求对象
		 * @param response 响应对象
		 */
		@Override
		public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
			Logger logger = LoggerFactory.getLogger(AliyunSmsClient.class);
			logger.error("请求阿里云短信API出现异常", ex);
		}
	}
}